package com.sky.aspect;


import com.sky.dto.DishDTO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/*
 * 自定义切面类, 用于实现公共字段自动执行
 * */
@Aspect  // 表示当前类是一个切面类
@Component
@Slf4j
public class AutoDeAspect {

    @Autowired
    private RedisTemplate redisTemplate;

    /*
     * 切入点
     * */
    @Pointcut("execution(* com.sky.controller.admin.DishController.*(..)) && @annotation(com.sky.annotation.AutoDe)")
    public void doAutoDe() {}


    /*
    * 通知
    * */
    @Before("doAutoDe()")
    public void autoDe(JoinPoint joinPoint) throws Throwable {
        try {
            // 获取方法参数中的分类ID
            Object[] args = joinPoint.getArgs();
            Long categoryId = extractCategoryId(args);

            if (categoryId != null) {
                // 生成缓存键
                String cacheKey = "dish_" + categoryId;

                // 删除缓存
                Boolean deleted = redisTemplate.delete(cacheKey);

                if (Boolean.TRUE.equals(deleted)) {
                    log.info("已清理菜品缓存: {}", cacheKey);
                } else {
                    log.info("缓存不存在: {}", cacheKey);
                }
            } else {
                log.warn("未找到分类ID参数，无法清理缓存");
            }

        } catch (Exception e) {
            log.error("缓存清理失败", e);
            // 不抛出异常，避免影响主业务
        }

    }



    /**
     * 从方法参数中提取分类ID
     */
    private Long extractCategoryId(Object[] args) {
        if (args == null || args.length == 0) {
            return null;
        }

        // 方案1：先尝试直接找Long类型的参数（可能是categoryId）
        for (Object arg : args) {
            if (arg instanceof Long) {
                return (Long) arg;
            }
        }

        // 方案2：如果找不到Long参数，尝试从DishDTO对象中获取
        for (Object arg : args) {
            if (arg instanceof DishDTO) {
                DishDTO dishDTO = (DishDTO) arg;
                return dishDTO.getCategoryId();
            }
        }

        // 方案3：尝试从其他可能包含categoryId的对象中获取
        for (Object arg : args) {
            // 这里可以根据您的实际业务对象扩展
            if (arg != null) {
                try {
                    // 使用反射获取categoryId属性（如果存在）
                    Method getCategoryId = arg.getClass().getMethod("getCategoryId");
                    Object result = getCategoryId.invoke(arg);
                    if (result instanceof Long) {
                        return (Long) result;
                    }
                } catch (Exception e) {
                    // 忽略异常，继续尝试其他参数
                }
            }
        }

        return null; // 没找到分类ID
    }

}
